﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using kp.rechenwerk.contract;


namespace kp.rechenwerk
{
    public class Rechenwerk : IRechenwerk
    {
        public  IEnumerable<PointF> Berechne(Func<double, double> formel, double xMin, double xMax, int werteAnzahl)
        {
            double[] xwerte = ErzeugeXWerte(xMin, xMax, werteAnzahl);
            PointF[] punkte = ErzeugePunkte(xwerte, formel);
            return punkte;
        }

        internal PointF[] ErzeugePunkte(double[] xwerte, Func<double,  double> formel)
        {
            PointF[] punkte = new PointF[xwerte.Length];
            int i = 0;
            foreach(double xwert in xwerte)
            {
                punkte[i++] = new PointF((float)xwert, (float)formel(xwert));
            }
            return punkte;
        }


        internal double[] ErzeugeXWerte(double xMin, double xMax, int werteAnzahl)
        {
            if (werteAnzahl < 2) throw new ArgumentException("Es müssen mindestens zwei Wertepaare angefordert werden!");
            double step = (xMax - xMin)/(werteAnzahl - 1);
            double[] xWerte = new double[werteAnzahl];
            for (int i = 0; i < werteAnzahl - 1; i++ )
            {
                xWerte[i] = xMin + (i * step);
            }
            //kann ein Rundungsfehler auftreten für den letzten Wert auftreten????? Wir konnten kein Beispiel finden!
            xWerte[werteAnzahl - 1] = xMax;
            return xWerte;
        }
    
    }
}
